import configparser
import os


def read_config(config_file='config.ini'):
    """
    读取配置文件
    :param config_file: 配置文件路径
    :return: 配置对象
    """
    config = configparser.ConfigParser()

    # 获取当前文件所在目录
    current_dir = os.path.dirname(os.path.abspath(__file__))
    config_path = os.path.join(current_dir, config_file)

    if not os.path.exists(config_path):
        raise FileNotFoundError(f"配置文件不存在: {config_path}")

    config.read(config_path, encoding='utf-8')
    return config


def get_deepseek_api_key(config_file='config.ini'):
    """
    获取DeepSeek API密钥
    :param config_file: 配置文件路径
    :return: API密钥字符串
    """
    config = read_config(config_file)
    api_key = config.get('DEFAULT', 'DEEPSEEK_API_KEY', fallback=None)

    if not api_key:
        raise ValueError("在配置文件中未找到 DEEPSEEK_API_KEY")

    return api_key


def get_openai_api_key(config_file='config.ini'):
    """
    获取OpenAI API密钥
    :param config_file: 配置文件路径
    :return: API密钥字符串
    """
    config = read_config(config_file)
    api_key = config.get('DEFAULT', 'OPENAI_API_KEY', fallback=None)

    if not api_key:
        raise ValueError("在配置文件中未找到 OPENAI_API_KEY")

    return api_key


def get_openai_hk_api_key(config_file='config.ini'):
    """
    获取OpenAI HK API密钥
    :param config_file: 配置文件路径
    :return: API密钥字符串
    """
    config = read_config(config_file)
    api_key = config.get('DEFAULT', 'OPENAI_HK_API_KEY', fallback=None)

    if not api_key:
        raise ValueError("在配置文件中未找到 OPENAI_HK_API_KEY")

    return api_key


def get_coze_config(config_file='config.ini'):
    """
    获取Coze配置
    :param config_file: 配置文件路径
    :return: 包含token和workflow_id的字典
    """
    config = read_config(config_file)
    token = config.get('DEFAULT', 'COZE_API_TOKEN', fallback=None)
    workflow_id = config.get('DEFAULT', 'COZE_WORKFLOW_ID', fallback=None)

    return {
        'token': token,
        'workflow_id': workflow_id
    }


def get_mem0_api_key(config_file='config.ini'):
    """
    获取Mem0 API密钥
    :param config_file: 配置文件路径
    :return: API密钥字符串
    """
    config = read_config(config_file)
    api_key = config.get('DEFAULT', 'MEM0_API_KEY', fallback=None)

    if not api_key:
        raise ValueError("在配置文件中未找到 MEM0_API_KEY")

    return api_key


def get_ollama_host(config_file='config.ini'):
    """
    获取Ollama主机地址
    :param config_file: 配置文件路径
    :return: Ollama主机地址字符串
    """
    config = read_config(config_file)
    host = config.get('DEFAULT', 'OLLAMA_HOST', fallback='http://localhost:11434')
    return host


def get_milvus_config(config_file='config.ini'):
    """
    获取Milvus配置
    :param config_file: 配置文件路径
    :return: 包含Milvus配置的字典
    """
    config = read_config(config_file)

    milvus_config = {
        'url': config.get('database', 'MILVUS_URL', fallback=None),
        'token': config.get('database', 'MILVUS_TOKEN', fallback=None),
        'collection_name': config.get('database', 'MILVUS_COLLECTION_NAME', fallback='quickstart_mem0_with_milvus'),
        'embedding_model_dims': config.get('database', 'MILVUS_EMBEDDING_MODEL_DIMS', fallback='1536'),
        'version': config.get('database', 'MILVUS_VERSION', fallback='v1.1')
    }

    # 检查必需的配置项
    if not milvus_config['url']:
        raise ValueError("在配置文件中未找到 MILVUS_URL")
    if not milvus_config['token']:
        raise ValueError("在配置文件中未找到 MILVUS_TOKEN")

    return milvus_config


def get_bailian_config(config_file='config.ini'):
    """
    获取百炼配置
    :param config_file: 配置文件路径
    :return: 包含token和workflow_id的字典
    """
    config = read_config(config_file)
    token = config.get('DEFAULT', 'BAILIAN_API_TOKEN', fallback=None)

    return {
        'token': token
    }


def get_dashscope_config(config_file='config.ini'):
    """
    获取阿里云百炼DashScope配置
    :param config_file: 配置文件路径
    :return: 包含DashScope配置的字典
    """
    config = read_config(config_file)
    
    dashscope_config = {
        'api_key': config.get('DEFAULT', 'DASHSCOPE_API_KEY', fallback=None),
        'base_url': config.get('DEFAULT', 'DASHSCOPE_BASE_URL', fallback='https://dashscope.aliyuncs.com/compatible-mode/v1')
    }
    
    if not dashscope_config['api_key']:
        raise ValueError("在配置文件中未找到 DASHSCOPE_API_KEY")
    
    return dashscope_config


def get_embedder_config(config_file='config.ini'):
    """
    获取嵌入模型配置
    :param config_file: 配置文件路径
    :return: 包含嵌入模型配置的字典
    """
    config = read_config(config_file)
    
    embedder_config = {
        'provider': config.get('embedder', 'provider', fallback='dashscope'),
        'model': config.get('embedder', 'model', fallback='text-embedding-v4'),
        'dimensions': config.getint('embedder', 'dimensions', fallback=1024),
        'dashscope_base_url': config.get('embedder', 'dashscope_base_url', fallback='https://dashscope.aliyuncs.com/compatible-mode/v1'),
        'ollama_base_url': config.get('embedder', 'ollama_base_url', fallback='http://localhost:11434')
    }
    
    return embedder_config


def get_serpapi_api_key(config_file='config.ini'):
    """
    获取SerpAPI API密钥
    :param config_file: 配置文件路径
    :return: API密钥字符串
    """
    config = read_config(config_file)
    api_key = config.get('DEFAULT', 'SERPAPI_API_KEY', fallback=None)

    if not api_key:
        raise ValueError("在配置文件中未找到 SERPAPI_API_KEY")

    return api_key


def get_tavily_api_key(config_file='config.ini'):
    """
    获取Tavily API密钥
    :param config_file: 配置文件路径
    :return: API密钥字符串
    """
    config = read_config(config_file)
    api_key = config.get('DEFAULT', 'TAVILY_API_KEY', fallback=None)

    if not api_key:
        raise ValueError("在配置文件中未找到 TAVILY_API_KEY")

    return api_key


def get_langsmith_config(config_file='config.ini'):
    """
    获取LangSmith配置
    :param config_file: 配置文件路径
    :return: 包含LangSmith配置的字典
    """
    config = read_config(config_file)
    
    langsmith_config = {
        'tracing_v2': config.get('DEFAULT', 'LANGCHAIN_TRACING_V2', fallback='true'),
        'endpoint': config.get('DEFAULT', 'LANGCHAIN_ENDPOINT', fallback='https://api.smith.langchain.com'),
        'project': config.get('DEFAULT', 'LANGCHAIN_PROJECT', fallback='LangchainDemo'),
        'api_key': config.get('DEFAULT', 'LANGCHAIN_API_KEY', fallback=None)
    }
    
    return langsmith_config


def get_langserver_config(config_file='config.ini'):
    """
    获取LangServer配置
    :param config_file: 配置文件路径
    :return: 包含LangServer配置的字典
    """
    config = read_config(config_file)
    
    langserver_config = {
        'host': config.get('langserver', 'host', fallback='0.0.0.0'),
        'port': config.getint('langserver', 'port', fallback=8000),
        'model_name': config.get('langserver', 'model_name', fallback='gpt-4o-mini'),
        'proxy_host': config.get('langserver', 'proxy_host', fallback='127.0.0.1'),
        'proxy_port': config.get('langserver', 'proxy_port', fallback='12334'),
        'app_title': config.get('langserver', 'app_title', fallback='我的Langchain服务'),
        'app_version': config.get('langserver', 'app_version', fallback='V1.0'),
        'app_description': config.get('langserver', 'app_description', fallback='使用Langchain翻译任何语句的服务'),
        'chain_path': config.get('langserver', 'chain_path', fallback='/chainDemo')
    }
    
    return langserver_config


def get_client_config(config_file='config.ini'):
    """
    获取客户端配置
    :param config_file: 配置文件路径
    :return: 包含客户端配置的字典
    """
    config = read_config(config_file)
    
    client_config = {
        'server_url': config.get('client', 'server_url', fallback='http://127.0.0.1:8000'),
        'chain_path': config.get('client', 'chain_path', fallback='/chainDemo')
    }
    
    return client_config


def get_siliconflow_config(config_file='config.ini'):
    """
    获取Siliconflow配置
    :param config_file: 配置文件路径
    :return: 包含Siliconflow配置的字典
    """
    config = read_config(config_file)
    
    siliconflow_config = {
        'api_key': config.get('DEFAULT', 'SILICONFLOW_API_KEY', fallback=None),
        'base_url': config.get('DEFAULT', 'SILICONFLOW_BASE_URL', fallback='https://api.siliconflow.cn/v1')
    }
    
    if not siliconflow_config['api_key']:
        raise ValueError("在配置文件中未找到 SILICONFLOW_API_KEY")
    
    return siliconflow_config
